﻿#region Opis pliku
//-----------------------------------------------------------------------------
// InputState.cs
// Autor: Jan Czarnowski
// 23.10.2012
//-----------------------------------------------------------------------------
#endregion

#region Using Statements

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using System.Collections.Generic;

#endregion

namespace pogra
{
    /// <summary>
    /// Klasa pomocnicza przechowująca obecne i poprzednie stany
    /// klawiatury i myszy. Pozwala to wykrywać jednokrotne
    /// wciśnięcia przycisków oraz gesty.
    /// </summary>
    public class InputState
    {
        #region pola

        public KeyboardState CurrentKeyboardState;
        public MouseState CurrentMouseState;

        public KeyboardState LastKeyboardState;
        public MouseState LastMouseState;

        #endregion

        #region inicjalizacja

        /// <summary>
        /// Tworzy nowy obiekt InputState
        /// </summary>
        public InputState()
        {
            CurrentKeyboardState = new KeyboardState();
            CurrentMouseState = new MouseState();

            LastKeyboardState = new KeyboardState();
            LastMouseState = new MouseState();
        }

        #endregion

        #region metody publiczne

        /// <summary>
        /// Wczytuje nowy stan klawiatury i myszy
        /// </summary>
        public void Update()
        {
            LastKeyboardState = CurrentKeyboardState;
            LastMouseState = CurrentMouseState;

            CurrentKeyboardState = Keyboard.GetState();
            CurrentMouseState = Mouse.GetState();
        }

        /// <summary>
        /// Metoda pomocnicza służąca do sprawdzania czy dany klawisz 
        /// na klawiaturze został wciśnięty pierwszy raz.
        /// </summary>
        public bool IsNewKeyPress(Keys key)
        {

            return (CurrentKeyboardState.IsKeyDown(key) &&
                    LastKeyboardState.IsKeyUp(key));
        }

        /// <summary>
        /// Metoda pomocnicza służąca do sprawdzania czy lewy przycisk
        /// myszy został wciśnięty pierwszy raz.
        /// </summary>
        public bool IsNewMLeftButtonPressed()
        {
            return (CurrentMouseState.LeftButton == ButtonState.Pressed &&
                    LastMouseState.LeftButton == ButtonState.Released);
        }

        /// <summary>
        /// Metoda pomocnicza służąca do sprawdzania czy prawy przycisk
        /// myszy został wciśnięty pierwszy raz.
        /// </summary>
        public bool IsNewMRightButtonPressed()
        {
            return (CurrentMouseState.RightButton == ButtonState.Pressed &&
                    LastMouseState.RightButton == ButtonState.Released);
        }

        /// <summary>
        /// Metoda pomocnicza służąca do sprawdzania czy środkowy przycisk
        /// myszy został wciśnięty pierwszy raz.
        /// </summary>
        public bool IsNewMMiddleButtonPressed()
        {
            return (CurrentMouseState.MiddleButton == ButtonState.Pressed &&
                    LastMouseState.MiddleButton == ButtonState.Released);
        }

        /// <summary>
        /// Metoda pomocnicza służąca do sprawdzania czy lewy przycisk
        /// myszy został wciśnięty pierwszy raz.
        /// </summary>
        public bool WasMLeftButtonReleased()
        {
            return (CurrentMouseState.LeftButton == ButtonState.Released &&
                    LastMouseState.LeftButton == ButtonState.Pressed);
        }

        /// <summary>
        /// Metoda pomocnicza służąca do sprawdzania czy prawy przycisk
        /// myszy został wciśnięty pierwszy raz.
        /// </summary>
        public bool WasMRightButtonReleased()
        {
            return (CurrentMouseState.RightButton == ButtonState.Released &&
                    LastMouseState.RightButton == ButtonState.Pressed);
        }

        /// <summary>
        /// Metoda pomocnicza służąca do sprawdzania czy środkowy przycisk
        /// myszy został wciśnięty pierwszy raz.
        /// </summary>
        public bool WasMMiddleButtonReleased()
        {
            return (CurrentMouseState.MiddleButton == ButtonState.Released &&
                    LastMouseState.MiddleButton == ButtonState.Pressed);
        }

        /// <summary>
        /// Metoda pomocnicza służąca do sprawdzania czy rolka myszki
        /// została przesunięta w górę
        /// </summary>
        public bool isNewMWheelUp()
        {
            return ((CurrentMouseState.ScrollWheelValue - LastMouseState.ScrollWheelValue) > 0);
        }

        /// <summary>
        /// Metoda pomocnicza służąca do sprawdzania czy rolka myszki
        /// została przesunięta w dół
        /// </summary>
        public bool isNewMWheelDown()
        {
            return ((CurrentMouseState.ScrollWheelValue - LastMouseState.ScrollWheelValue) < 0);
        }
        
        #endregion
    }
}